package com.lagou.edu.factory.parser;

import org.dom4j.Element;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

/**
 * @Author: ZLY
 * @Date: 2020/10/14 22:56
 * @Description:
 */
public class PropertyBeanDefinitionParser {
    // 实例化完成之后维护对象的依赖关系，检查哪些对象需要传值进入，根据它的配置，我们传入相应的值
    // 有property子元素的bean就有传值需求
    public void parse(List<Element> elementList, Map<String,Object> beanMap) throws NoSuchFieldException, IllegalAccessException {
        // 解析property，获取父元素
        for (int i = 0; i < elementList.size(); i++) {
            Element element =  elementList.get(i);   //<property name="AccountDao" ref="accountDao"></property>
            String name = element.attributeValue("name");
            String ref = element.attributeValue("ref");

            // 找到当前需要被处理依赖关系的bean
            Element parent = element.getParent();

            // 调用父元素对象的反射功能
            String parentId = parent.attributeValue("id");
            Object parentObject = beanMap.get(parentId);
            // 遍历父对象中的所有方法，找到"set" + name
            Method[] methods = parentObject.getClass().getMethods();
            //设置属性值
            Field accountDao = parentObject.getClass().getDeclaredField(name);
            accountDao.setAccessible(true);
            accountDao.set(parentObject,beanMap.get(ref));

            // 把处理之后的parentObject重新放到map中
            beanMap.put(parentId,parentObject);

        }

    }

}
